package com.example.jacky.android_easeui.utils;

import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.util.HashMap;
/**
 * 第一步：将占用内存较多的手机，添加到袋子中
 * 第二步：手机被GC回收，清理空袋子
 * @author Administrator
 *
 * @param <K>
 * @param <V>
 */
public class SoftMap<K, V> extends HashMap<K, V> {
	/**
	 *  存放软引用的袋子
	 */
	private HashMap<K, SoftValue<K,V>> temp;
	/**
	 * 但凡装V的袋子，都可以放到该集合中,便于清理空袋子
	 */
	private ReferenceQueue<V> queue;
	public SoftMap() {
		temp = new HashMap<K, SoftValue<K,V>>();
		queue = new ReferenceQueue<V>();
	}
	/**
	 * 增强版的袋子，增加key属性，标记袋子
	 * @author Administrator
	 *
	 * @param <K>
	 * @param <V>
	 */
	private class SoftValue<K,V> extends SoftReference<V> {
		private Object key;
		public SoftValue(K key, V r, ReferenceQueue<? super V> q) {
			super(r, q);
			this.key = key;
		}
		
	}
	
	@Override
	public V put(K key, V value) {
		SoftValue<K, V> sr = new SoftValue<K, V>(key, value, queue);
		temp.put(key, sr);
		return null;
	}
	
	@Override
	public V get(Object key) {
		cleanSR();
		SoftValue<K, V> sr = temp.get(key);
		if(sr != null) {
			return sr.get();
		}
		return null;
	}
	
	@Override
	public boolean containsKey(Object key) {
		return get(key) != null;
	}
	/**
	 * 清理袋子
	 */
	public void cleanSR() {
		SoftValue<K, V> sr = (SoftValue<K, V>) queue.poll();
		while(sr != null) {
			temp.remove(sr.key);
			sr = (SoftValue<K, V>) queue.poll();
		}
	}
}
